﻿using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

namespace _102_跨线程访问BlockingCollection集合_集合
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建实例
            using (BlockingCollection<int> 实例 = new BlockingCollection<int>())
            {
                //在using代码块内部，创建第一个Task用于向集合添加元素
                Task t1 = Task.Run(async () =>
                {
                    for (int k = 0; k < 5; k++)
                    {
                        int item = k + 1;
                        Console.WriteLine("即将添加元素:{0}", item);
                        实例.Add(item);
                        await Task.Delay(650);
                    }
                //标记实例已经完成
                    实例.CompleteAdding();
                });

                //创建第二个实例用于从集合中移除元素
                Task t2 = Task.Run(() =>
                {
                    while (true)
                    {
                        if (实例.TryTake(out int item))
                        {
                            Console.WriteLine("取出元素：{0}", item);
                        }
                        //是否退出循环
                        if (实例.IsCompleted) break;
                    }
                });
                //调用WaitAll方法将所有Task执行完成，然后释放上面两个Task
                Task.WaitAll(t1, t2);
                t1.Dispose();
                t2.Dispose();
            }
            Console.Read();
        }
    }
}
